package reportes.Modulos;

import BD.Pagoempleados;
import BD.Pagoscliente;
import BD.Pagosproveedores;
import BD.Proceso;
import Utilidades.ManejadorFechas;
import java.util.HashMap;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.view.JasperViewer;

public class ModuloReporteNoBD {

    //Recibe el objeto tabla que se va a cargar
    static JTable tabla;
    //Recibe el nombre de la tabla que se va a cargar
    static String nombreTabla = "";
    //Gestiona la conexion a la base de datos

    public ModuloReporteNoBD(JTable objetoTabla, String nombreTabla) {
        //Recupero los objetos tabla y el nombre de la tabla
        this.tabla = objetoTabla;
        this.nombreTabla = nombreTabla;
        //Abre el reporte
        ejecutarReporte();
    }

    //Dependiendo de el nombre de la tabla es el reporte que se va a cargar
    private String eligeRutaReporte() {
        String reporte = "";
        switch (nombreTabla) {
            case "Clientes":
                //Guarda la ruta especifica para el caso de Clientes
                reporte = System.getProperty("user.dir")
                        + "/reporteClientesNoBD.jrxml";
                break;
            case "Empleados":
                //Guarda la ruta especifica para el caso de Empleados
                reporte = System.getProperty("user.dir")
                        + "/reporteEmpleadosNoBD.jrxml";
                break;
            case "Proveedores":
                //Guarda la ruta especifica para el caso de Proveedores
                reporte = System.getProperty("user.dir")
                        + "/reporteProveedoresNoBD.jrxml";
                break;
            case "Proceso":
                //Guarda la ruta especifica para el caso de Proceso
                reporte = System.getProperty("user.dir")
                        + "/reporteProcesoNoBD.jrxml";
                break;
        }
        return reporte;
    }

    //Recupera las entidades objeto por objeto de las tabas
    private static java.util.Collection coleccionesIdentidades() {
        int i = 0;
        java.util.Vector<Pagoscliente> collectionClientes
                = new java.util.Vector<Pagoscliente>();
        java.util.Vector<Pagosproveedores> collectionProveedores
                = new java.util.Vector<Pagosproveedores>();
        java.util.Vector<Pagoempleados> collectionEmpleados
                = new java.util.Vector<Pagoempleados>();
        java.util.Vector<Proceso> collectionProceso
                = new java.util.Vector<Proceso>();
        //Recorre cada fila de la tabla
        while (i < tabla.getModel().getRowCount()) {
            if (nombreTabla.equals("Clientes")) {
                //Pasa cada objeto de la tabla Clientes a la coleccionesIdentidades
                collectionClientes.add(
                        new Pagoscliente(
                                ManejadorFechas.getFechaActual(),
                                tabla.getModel().getValueAt(i, 0).toString(),
                                Double.parseDouble(tabla.getModel().
                                        getValueAt(i, 1).toString()))
                );
                i++;
            }
            if (nombreTabla.equals("Empleados")) {
                char tipoPago;
                if (tabla.getValueAt(i, 4).toString().equals("Por Tiempo")) {
                    tipoPago = "0".charAt(0);
                } else {
                    tipoPago = "1".charAt(0);
                }
                //Pasa cada objeto de la tabla Clientes a la coleccionesIdentidades
                collectionEmpleados.add(
                        new Pagoempleados(
                                ManejadorFechas.getFechaActual(),
                                tabla.getModel().getValueAt(i, 0).toString(),
                                tipoPago,
                                tabla.getModel().getValueAt(i, 1).toString(),
                                Integer.parseInt(tabla.getModel()
                                        .getValueAt(i, 2).toString()),
                                Double.parseDouble(tabla.getModel()
                                        .getValueAt(i, 3).toString()),
                                Double.parseDouble(tabla.getModel()
                                        .getValueAt(i, 5).toString())
                        ));
                i++;
            }
            if (nombreTabla.equals("Proveedores")) {
                //Pasa cada objeto de la tabla Clientes a la coleccionesIdentidades
                collectionProveedores.add(
                        new Pagosproveedores(
                                ManejadorFechas.getFechaActual(),
                                tabla.getModel().getValueAt(i, 0).toString(),
                                Double.parseDouble(tabla.getModel().
                                        getValueAt(i, 3).toString()))
                );
                i++;
            }
            if (nombreTabla.equals("Proceso")) {
                //Pasa cada objeto de la tabla Clientes a la coleccionesIdentidades
                collectionProceso.add(
                        new Proceso(
                                Integer.parseInt(tabla.getModel().getValueAt(i, 0).toString()),
                                tabla.getModel().getValueAt(i, 1).toString(),
                                Integer.parseInt(tabla.getModel().getValueAt(i, 2).toString()),
                                tabla.getModel().getValueAt(i, 3).toString()
                        ));
                i++;
            }
        }
        if (nombreTabla.equals("Proceso")) {
            return collectionProceso;
        }
        if (nombreTabla.equals("Clientes")) {
            return collectionClientes;
        }
        if (nombreTabla.equals("Empleados")) {
            return collectionEmpleados;
        }
        if (nombreTabla.equals("Proveedores")) {
            return collectionProveedores;
        }
        return null;
    }

    //Ejecuta y muestra en pantalla elreporte
    private void ejecutarReporte() {
        if (true) {
            try {
                //Elige la ruta del reporte
                String rutaReporte = eligeRutaReporte();
                //si la ruta del reporte es null marca error
                if (rutaReporte == null) {
                    JOptionPane.showMessageDialog(null,
                            "Error al cargar reporte, motivos:/n"
                            + "-No existe el archivo a cargar/n"
                            + "-La ruta esta mal especificada",
                            "Generar Reporte", JOptionPane.ERROR_MESSAGE);
                }
                JasperReport masterReport = null;
                try {
                    masterReport = JasperCompileManager.compileReport(rutaReporte);
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(null, e,
                            "Error al cargar reporte", JOptionPane.ERROR_MESSAGE);
                    System.out.println(e);
                }
                //Llena el reporte con los datos especificados
                JasperPrint jasperPrint
                        = JasperFillManager.fillReport(
                                masterReport,//va a contener la informacion 
                                new HashMap(),//para los parametros
                                //Es -coleccionesIdentidades- la fuente de datos
                                new JRBeanCollectionDataSource(coleccionesIdentidades()));
                //Manda el comando para mostrar en pantalla el reporte
                JasperViewer.viewReport(jasperPrint, false);
            } catch (JRException e) {
                JOptionPane.showMessageDialog(null, "Error al compilar reporte",
                        "Generar Reporte", JOptionPane.ERROR_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(null, "No existen registros para mostrar en reporte",
                    "Generar Reporte", JOptionPane.ERROR_MESSAGE);
        }
    }
}
